<?php

// the image validator extending the file validator
class sfValidatorFileImage extends sfValidatorFile
{

  protected function configure($options = array(), $messages = array())
  {
    //Минимальный размер изображения (бОльший из размеров)
    $this->addOption('min_size');
    
    /* we set a default value as image for mime type */
    $this->addOption('mime_types' , 'web_images');
    
    //Параметры преобразования изображения
    $this->addOption('size');
    $this->addOption('quality');
    $this->addOption('contrast');


    $this->addMessage('min_size', 'Изображение слишком маленькое (%size%). Нужно минимум %min_size% пикселей.');
    $this->addMessage('mime_types', 'Недопустимый формат файла (%mime_type%).');
   
    parent::configure($options, $messages);
  }
  
  private function setImageQuality(&$image)
  {
    if ($this->hasOption('quality'))
    {
      $image->setQuality($this->getOption('quality'));
    }
  }
  

  protected function doClean($value)
  {
    $validatedFile = parent::doClean($value);
    
    $size = getimagesize($validatedFile->getTempName());
    
    //Проверка размеров (сравниваем с бОльшим из размеров)
    $size=max($size[0],$size[1]);
    if ($this->hasOption('min_size') && $this->getOption('min_size') > $size)
    {
      throw new sfValidatorError($this, 'min_size', array('min_size' => $this->getOption('min_size'), 'size' => (int) $size));
    }

    //Сжимаем оригинальное изображение (если оно слишком большое)
    if ($this->hasOption('size') and $this->getOption('size')<=$size)
    {
      $image=new sfImage($validatedFile->getTempName(), $validatedFile->getType());
      $image->thumbnail($this->getOption('size'),$this->getOption('size'),'scale');
      $this->setImageQuality($image);
      $image->save('test');
    }
    

    //Регулируем контрастность
    if ($this->hasOption('contrast'))
    {
      $image=new sfImage($validatedFile->getTempName(), $validatedFile->getType());
      $image->contrast($this->getOption('contrast'));
      $this->setImageQuality($image);
      $image->save('test2');
    }

    return $validatedFile;
  }
}
